home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 076-100 / scopedisk89 / uut / head.c < prev    next >
C/C++ Source or Header  |  1995-03-19  |  3KB  |  96 lines

  1. /*
  2.  * head - a program to print out the first n lines of a file.
  3.  * Author: Edwin Hoogerbeets
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <ctype.h>
  8.  
  9. #define toint(a) (int)((a) - '0')
  10.  
  11. main(argc,argv)
  12. int argc;
  13. char **argv;
  14. {
  15.         register int lines = 10, multiple_files, index = 1;
  16.  
  17.         /* if there are no arguments, take from the stdin */
  18.         if ( argc == 1 ) {
  19.                 head(stdin,lines);
  20.                 exit(0);
  21.         }
  22.  
  23.         /* if the first argument starts with '-', assume it is an option */
  24.         if ( *argv[index] == '-' ) {
  25.                 register char *foo;
  26.  
  27.                 lines = 0;
  28.  
  29.                 /* pointer to character after the dash */
  30.                 foo = &argv[index][1];
  31.  
  32.                 /* get the number of lines to display */
  33.                 while ( isdigit(*foo) ) {
  34.                         lines = lines*10 + toint(*foo++);
  35.                 }
  36.  
  37.                 /* increment so that we don't try to print out the file '-99' below! */
  38.                 ++index;
  39.         }
  40.  
  41.         /* see how many arguments are left */
  42.         switch ( argc - index ) {
  43.  
  44.                 /* none, so there must only have been a -nn argument */
  45.                 case 0:
  46.                         head(stdin,lines);
  47.                         exit(0);
  48.  
  49.                 /* only one, so make a note of that */
  50.                 case 1:
  51.                         multiple_files = 0;
  52.                         break;
  53.  
  54.                 /* more than one. (argc - index) cannot be negative */
  55.                 default:
  56.                         multiple_files = 1;
  57.                         break;
  58.         }
  59.  
  60.         /* for each of the remaining args, open them and "head" them */
  61.         for ( ; index < argc ; index++ ) {
  62.                 register FILE *in;
  63.  
  64.                 /* only print this header line if there is more than one file */
  65.                 if ( multiple_files ) {
  66.                         printf("==> %s <==\n",argv[index]);
  67.                 }
  68.  
  69.                 if ( (in = fopen(argv[index],"r")) == NULL ) {
  70.                         fprintf(stderr,"Warning: could not open file %s\n",argv[index]);
  71.                 } else {
  72.                         head(in,lines);
  73.                         fclose(in);
  74.                 }
  75.         }
  76. }
  77.  
  78. /*
  79.  * read "num" lines from the file "file" and print them to the stdout
  80.  */
  81. head(file,num)
  82. FILE *file;
  83. int num;
  84. {
  85.         char buffer[BUFSIZ];  /* line lengths limited to BUFSIZ :-( */
  86.         register int count;
  87.  
  88.         for ( count = 0; count < num; count++ ) {
  89.                 if ( !feof(file) ) {
  90.                         fgets(buffer,BUFSIZ,file);
  91.                         fputs(buffer,stdout);
  92.                 }
  93.         }
  94. }
  95.  
  96.